package com.atguigu.java;

import org.junit.Test;

import java.io.*;

/**
 * 一：流的分类：
 * 1.按照操作单位不同，分为字节流和字符流
 * 2.按照数据的流向分为： 输入流  和  输出流
 * 3.流的角色：  节点流  处理流
 * 二。流的体系结构
 * 抽象基类            节点流(或文件流)           缓冲流（处理流的一种）
 * InputStream     FileInputStream         BufferInputStream
 * OutPutStream    FileOutPutStream        BufferOutputStream
 * Reader          FileReader              BufferReader
 * Writer          FileWriter              BufferWriter
 *
 * @author shkstart
 * @create 2021-01-26 21:25
 */
public class FileReaderWriterTest {
    public static void main(String[] args) {
        File file = new File("java_13_io\\Hello.txt"); //main 中 的书写方式
        System.out.println(file);
        System.out.println(file.getAbsolutePath());
        boolean a = file.isFile();
        System.out.println(a);
    }

    @Test

    /*
     * 将java_13_io下的Hello.txt文件内容读入到程序中，并输出到控制台
     *
     * 说明点:
     *   1.read()的理解：返回读入的一个字符，如果文件到达末尾，则返回-1
     *   2.异常的处理 ，为了保证流资源一定可以关闭
     *   3.读入的文件一定要存在，否则会报FileNotFoundException.
     *
     * */
    public void test1() {
        //1.实例化File类的对象，指明要操作的文件
        // Test（单元测试放下）下的书写方式  相较于当前Moudle下的文件
        FileReader fileReader = null;
        try {
            File file = new File("Hello.txt");
//        System.out.println(file.getAbsolutePath());
            //2.提供具体的流
            fileReader = new FileReader(file);
            //3.数据的读入
            //read（）：返回读入的一个字符，如果到达文件尾部，返回-1；

            int data;
            while ((data = fileReader.read()) != -1) {
                System.out.println((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null)
            //4.流的关闭操作
            {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }


    }

    //对Read()操作升级：使用read的重载方法
    @Test
    public void test2() throws FileNotFoundException {
        FileReader fileReader = null;
        try {
            //1.File 类的实例化
            File file = new File("Hello.txt");

            //2.FileReader流的实例化
            fileReader = new FileReader(file);

            //3.读入的具体操作细节
            //read(char[] chars)：返回每次读入的字符个数,如果读到文件末尾。返回-1
            char[] chars = new char[5];
            int len;
            while ((len = fileReader.read(chars)) != -1) {
                for (int i = 0; i < len; i++) {
                    System.out.println(chars[i]);

                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.流资源的关闭
            try {
                assert fileReader != null;
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 从内存中写出数据到磁盘的文件中
     * 说明：
     * 1.输出操作，对应的file文件可以不存在，并不会报异常
     * 2.file对应的硬盘中的文件如果不存在，在创建的过程中会自动创建
     * 3.如果存在，
     * 如果使用的构造器是  FileWrite(file,false)/File(file)相对于对原有文件的覆盖
     * 如果使用的构造器是  FileWrite(file,true)不会对原有文件进行覆盖，而是采用追加的方式
     */
    @Test
    public void test3() throws IOException {
        FileWriter fileWriter = null;
        try {
            //1.创建File类的对象
            File file = new File("hello1.txt");

            //2.提供FileWrite的对象，用于数据的写出
            fileWriter = new FileWriter(file, false);

            //3.写出的操作
            fileWriter.write("i  am  you  father");
            fileWriter.write("我一定会找到工作的");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.流资源的关闭

            try {
                assert fileWriter != null;
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }


    }

    /*
     *
     *文本文件的复制
     * */
    @Test
    public void test4() throws IOException {
        FileReader fileReader = null;
        FileWriter fileWriter = null;
        try {
            //1.创建File类的对象,指明读入和写出的文件
            File fileR = new File("Hello.txt");
            File fileW = new File("hello1.txt");

            //错误的  不能使用字符流来处理字节文件
//            File fileR=new File("Capture001.png");
//            File fileW=new File("Capture001.png");
            //2.创建输出流和输入流的对象
            fileReader = new FileReader(fileR);
            fileWriter = new FileWriter(fileW);

            //3.数据的读入和写出的操作
            char[] chars = new char[5];
            int len;
            while ((len = fileReader.read(chars)) != -1) {
                fileWriter.write(chars, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流资源
            try {
                assert fileWriter != null;
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                assert fileReader != null;
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }


    }

}















